← Writeups

2 2FA simple bypass

GET /login HTTP/2 
POST /login HTTP/2
username=wiener&password=peter 
GET /login2 HTTP/2

Al realizar una interceptacion de la respuesta del envio del codigo mfa, el response body contiene el Header Location el cual indica la siguiente ruta, esto se obtiene al verificarlo con nuestro usuario. Entonces con el usuario carlos podemos eludir la ruta de /login2 visitando directamete el endpoint del usuario correspondiente /my-account?id=carlos eludiendo efectivamente la autenticacion de doble factor

POST /login2 HTTP/2
mfa-code=1234

HTTP/2 302 Found  
HTTP/2 302 Found
Location: /my-account?id=carlos 

La vulnerabilidad ocurre porque el sistema trata el MFA como parte del flujo de navegación y no como un requisito obligatorio de autorización en el backend. Después del POST /login, la sesión queda autenticada parcialmente, pero los endpoints protegidos como /my-account?id=carlos no validan que el segundo factor haya sido completado (mfa_verified == true). Además, el acceso depende de un parámetro manipulable (id) en lugar de derivar el usuario desde la sesión, lo que permite acceder directamente al recurso sin pasar por /login2, resultando en un bypass de MFA por lógica de autorización rota (clasificable como Broken Access Control según OWASP).

# Implementación vulnerable

# POST /login
if valid_credentials(username, password):
    session.user = username
    redirect("/login2")

# POST /login2
if valid_mfa(code):
    redirect("/my-account?id=" + session.user)

# GET /my-account
if session.user != null:
    show_account(request.id)   # ❌ No valida MFA ni que id == session.user